<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #app{
            border: 1px solid #cccccc;
            padding: 10px;
        }
        .box{
            border: 1px solid #cccccc;
            margin-left: 50px;
            padding: 10px;
        }
        p{
            padding-left: 20px;
        }
        input{
            margin-left: 20px;
        }
    </style>
    <script src="./js/vue.js"></script>
</head>
<body>
    <div id="app">
        <h3>父组件范围</h3>
        <p>msg:{{ msg }}</p>
        <input type="text" v-model="msg">
        <p>age:{{ age }}</p>
        <!-- 数据传递过程中，子组件属性绑定并不要求一定要保证属性名和传递的变量名一致 -->
        <!-- <child-one class="aaa" :test="msg" is-show="false"></child-one> -->
        <child-one class="aaa" :test="msg" :is-show="false" :age="age"></child-one>
        <hr>
        <!-- <child-one class="aaa" ></child-one> -->

    </div>
</body>
<script type="text/x-template" id="one">
    <div class="box">
        <h3>子组件范围</h3>
        <p>test:{{ test }}</p>
        <!-- <input type="text" v-model="test"> -->
        <p v-show="isShow">isShow:{{ isShow }}</p>
        <p>age:{{ age }}</p>
        <p>info:{{ info }}</p>
        <p>user:{{ user }}</p>
    </div>
</script>
<script>
    /*
        Vue提供了 构成时的 配置项 props ，专门用于拦截获取父组件传递的属性变量值，
                                         并完成属性名到变量名的转换
                                         同时完成和父组件变量的响应式关联
        props : 取值 Array|Object
            + Array : 用于快速加载传递的数据 - 数组中的每个元素对应需要定义属性名称
            + Object : 为需要拦截的数据提供自定义数据校验操作 - 该校验操作只是为开发人员提供调用规则的验证提示
                    - key 定义需要被拦截的属性名称
                    - value  constructor-name | Object
                            1、constructor-name ： JS数据构造器名称 - 描述该属性只能传递对应类型的数据
                            2、Object ：将校验规则进行拆解定义
                                type: constructor-name  描述该属性只能传递对应类型的数据
                                default：any 描述当前属性未被传递时，使用的默认值
                                required：Boolean 描述该属性是否为组件构成的必传属性（该配置和default冲突）
                                validator：Function 为开发者自定义校验规则提供定义区域

        props 属性为vue特殊数据仓库，专门用于记录来自于父组件传递的数据属性，
              但该数据仓库中所有的属性都是只读属性
        props 只会拦截一些被vue设定过的特殊属性或者自定义属性
        props 对可以拦截的属性进行拦截时，并不要求改属性一定以vue语法方式进行绑定
        props 拦截的属性名如果为驼峰方式，要注意页面标签定义时使用的是 连字符语法
        props 被props拦截的属性，本身会固定和父组件响应式关联，当对应的父组件数据变化，
              被拦截的属性也会发生变化
    */
    Vue.component("ChildOne",{
        template:"#one",
        // props:["test","class"]
        // props:["test","isShow"]
        props:{
            test:{
                type:String,
                required:true
            },
            isShow:Boolean,
            age:{
                type:Number,
                // validator:function(){}
                validator(value){
                    // console.log(value);
                    if(value>150||value<0){
                        // return false;
                        console.error("age取值范围在0~150之间");
                    }
                    // 通过返回 true或者false 表示校验通过或者失败
                    return true;
                }
            },
            info:{
                type:String,
                default:"info的默认变量"
            },
            user:{
                type:Object,
                // default:{
                //     name:"tom"
                // }
                default:function(){
                    return { name:"tom" }
                }
            }
        }

    })
    new Vue({
        el:"#app",
        data:{
            msg:"父组件变量MSG",
            age:23
        }
    })


</script>
</html>